#ifndef FILERECORD_H
#define FILERECORD_H

#include <iostream>
#include <vector>
#include "File.h"

// MACROS DEFINIDAS PARA EL RETORNO DE LOS METODOS

#define FR_OK 0
#define FR_ERROR 1
#define FR_EOF 2
#define FR_NO_EXISTE_ARCHIVO 3
#define FR_NO_EXISTE_REGISTRO 4


class FileRecord
{
	protected:
		// Atributos
		char* name;
		long int recordPointer;
		long int firstRecordFree;
		std::vector<long int> freeRecords;

		// Metodos
		void loadFreeRecords(long int firstRecordFree);
		void getFreeRecord(unsigned int size, long int &offset);
		void addFreeRecord(long int offset);
		void getOverhead(long int offset, unsigned int &sizeRecord, long int &sizeFreeRecord, char *state);
		void writeRecord(long int offset, unsigned int sizeFreeRecord, char* record, unsigned int size);
		

	public:
		// Constructores y destructores
		FileRecord();
		
		~FileRecord();

		// Metodos
		
		// Si puede crear el archivo devuelve FR_OK
		// caso contrario devuelve FR_ERROR
		unsigned int Create(const char* filename);

		// Si puede abrir el archivo devuelve FR_OK,
		// si el archivo no existiera devuelve FR_NO_EXISTE_ARCHIVO,
		// en otro caso devuelve FR_ERROR
		unsigned int Open(const char* filename);

		
		// Si puede agregar el registro devuelve FR_OK
		// caso contrario devuelve FR_ERROR
		unsigned int Add(char* record, unsigned int size, long int &offset);

		// Si el registro no existiera devuelve FR_NO_EXISTE_REGISTRO
		// caso contrario devuelve FR_OK, en otro caso devuelve FR_ERROR
		unsigned int Update(long int offset, char* newRecord, unsigned int size);

		// Si el registro no existiera devuelve FR_NO_EXISTE_REGISTRO
		// caso contrario devuelve FR_OK, en otro caso devuelve FR_ERROR
		unsigned int Remove(long int offset);

		// Si el registro no existiera devuelve FR_NO_EXISTE_REGISTRO
		// caso contrario devuelve FR_OK, en otro caso devuelve FR_ERROR
		unsigned int Get(long int offset, char* record, unsigned int &size);

		// Si puede cerrar el archivo devuelve FR_OK
		// caso contrario devuelve FR_ERROR
		unsigned int Close();

		// Si puede destruir el archivo devuelve FR_OK
		// caso contrario devuelve FR_ERROR
		unsigned int Destroy(const char* filename);

		// Si no hubiera mas registros devuelve TRUE
		bool HasNext();

		// Devuelve el registro apuntado por el record pointer y luego lo aumenta
		void Next(long int &offset, char* record, unsigned int &size);

};

#endif





